Certificación en Ciencia de datos

Módulo 3 - Visualizaciones básicas en ggplot2

Natalia da Silva

2024 -Módulo 3

Vimos

  • Importancia de la visualización

  • Porqué y para qué visualizar.

  • Gramática de gráficos y conexión con ggplot2

  • Definición de gráfico estadístico, usando la GG.

  • ¿Porqué usar ggplot2?

Veremos: Visualizaciones básicas con ggplot2 y uso de scales

Recordamos

La gramática gráfica responde las siguientes preguntas:

¿Qué es un gráfico estadístico

¿Cómo describir un gráfico?

¿Cómo crear un gráfico?

Recordamos

Un gráfico estadístico es un mapeo de los datos a atributos estéticos (ejem: color, forma, tamaño) de objetos geométricos (ejem: puntos, lineas, barras)

Libro ggplot2

ggplot2

  • Paquete con un sustento teórico basado en la gramática gráfica.

  • Define la GGC (gramática gráfica en capas)

ggplot2

Componentes en gráficos con ggplot2:

  • data
  • layers
  • scales
  • coord
  • facetas
  • theme

Tres componentes de todo plot

  • data: datos a visualizar

  • aes: un conjunto de mapeos estéticos entre las variables en los datos y las propiedades visuales (ejem: color, tamaño).

  • layer: al menos una capa que describe como representar cada observación. Las capas son creadas con la función geom.

Visualización de datos

  • La visualización de datos se basa en los datos, resumir información.

  • Hay diferentes tipos de visualización para enfatizar en distintos aspectos de los datos.

  • Los datos contienen observaciones y variables, en una forma tabular ordenada las observaciones están en las filas, las variables en las columnas y en cada celda tenemos un único valor

Visualización de datos

  • Todas las visualizaciones mapean valores en los datos en características cuantificables de un gráficos a las que llamamos elementos estéticos (aesthetics en ggplot2 aes())

Libro “Fundamentals of Data visualization” link (Wilke 2019)

Visualizaciones básicas

¿Cuáles son las visualizaciones más importantes?

Imposible de responder, pero algunos de ellos son:

  • Histogramas, gráfico de densidades, barras, de series de tiempo (todos en una dimensión )

  • Diagrama de dispersión, gráfico de caja lado a lado (2-dim), gráfico de coordenaddas paralelas, mosaico (dos dimensiones o más)

  • Mapas (información geográfica)

y más…

¿Porqué tantos tipos?

  • Diferentes tipos de visualizaciones debido al tipo diferente de variables.

  • Énfasis: cada gráfico puede mostrar un aspecto diferente de los datos.

Tipo de datos

Punto clave para hacer visualización: entender el tipo de variable que tenemos

  • Variable Continua: una variables con infinitos números de valores, como tiempo, peso.

  • Variable Discreta: variables numéricas que puede tomar un cierto número de valores. Ejemplo, “número de estudiantes en la clase”

  • Variable Categórica: variables que pueden ser definidas como grupos o categorías (color de pelo, nivel educativo, etc)

  • y más…

Reglas EDA

No hay reglas claras para hacer EDA (análisis exploratorio de datos) pero podemos empezar por algunas preguntas básicas:

  • ¿Cuál es la variabilidad de cierta variable?

  • ¿Cuál es la distribución de mis datos?

  • ¿Hay alguna relación entre alguna de las variables seleccionadas?

  • ¿Como covarian estas dos variables?

Distribución

Para identificar que herramientas usar en EDA deberíamos identificar que tipo de variables a analizar

Ejemplo:

  • Variables Categóricas, nosotros podemos analizar la distribución usando un gráfico de barras.

  • Variables continuas, podemos analizar la distribución usando un histograma.

Datos, starwars

Barras vs Histograma, starwars

  • Variable: categórica/cualitativa
  • Barras separados por espacios de igual tamaño
  • Barras pueden re-ordenarse y debería hacerse para mejorar la visualización
  • Parámetro: ninguno

  • Variable: continua/cuantitativa
  • Barras adyacentes
  • Barras no pueden ser re-ordenadas
  • Parámetro: ancho de la barra

¿Muestran lo mismo?

  • Histograma, gráfico de densidades, diagrama de puntos movidos y gráfico de caja

  • Cada gráfico enfatiza algo distinto de los datos: asimetría, modalidad, simetría, brechas, atípicos

  • No hay un gráfico correcto, todos son útiles en algún sentido

EDA, Covariación

  • Covariación es la tendencia de variación conjunta para los valores de dos o más variables.

  • La mejor forma de detectar la covariación es visualizar la relación entre dos o más variables.

  • El tipo de variables es lo que va a definir como visualizar la covariación.

Datos: cangrejos

Categórica vs Continua

  • Es común explorar la distibución de una variable continua de acuerdo a una variable categórica

  • Histogramas (geom_histogram()) o densidades (geom_density()) coloreadas por una variable categórica para comparar la distribuciones para cada categoría

Categória vs Continua, gráfico de caja y violín

Gráfico de caja:

  • Vemos la distribución de los datos para variables continuas

  • Basado en las 5 medidas de resumen (min, Q1, Q2, Q3, max).

  • Atípicos ( \(Q1–1.5*IQR\) y \(Q3 + 1.5*IQR\))

Violín: es una combinación entre el gráfico de cajas y el de densidades

Categória vs Continua, gráfico de caja y violín

Ejemplo propina

# cargamos los datos 
library(tidyverse)
propinas <- read_csv("propina.csv")
head(propinas)
# A tibble: 6 × 7
  total propina sexo  fuma  dia   momento cantidad
  <dbl>   <dbl> <chr> <chr> <chr> <chr>      <dbl>
1  17.0    1.01 F     No    Do    Noche          2
2  10.3    1.66 M     No    Do    Noche          3
3  21.0    3.5  M     No    Do    Noche          3
4  23.7    3.31 M     No    Do    Noche          2
5  24.6    3.61 F     No    Do    Noche          4
6  25.3    4.71 M     No    Do    Noche          4

Tres componentes de todo plot

  • data: propina
  • aes: total mapeado a la posición x , propina a la posición y.
  • layer: puntos mediante geom_point().
ggplot(data = propinas, aes(x = total, y = propina)) +  
  geom_point() +
  theme(aspect.ratio = 1)

aspect.ratio es el ratio entre el ancho y el alto

Diagrama de dispersión, datos propinas

Ejemplos geoms()

p <- ggplot(propinas, 
            aes(x =  dia, y = propina))
  • p
  • p + geom_point()
  • p + geom_boxplot()
  • p + geom_violin()

Categórica vs categóricas

  • Información a mostrar el conteo de observaciones para cada combinación

  • podemos usar geom_count(), geom_tile(), geom_bar() ….

Categórica vs categóricas

  • geom_count() es una variante de geom_point().

  • Cuenta el número de observaciones en cada combinación y mapea el conteo en la correspondiente posición.

Categórica vs categóricas

ggplot(propinas, 
        aes(x =  dia, y = cantidad)) +
  geom_count()

Categórica vs categóricas

  • geom_tile() cada combinación de variables es pintada con un color que representa un valor de otra variable en escala continua de color.

  • Por defecto el más claro representa mayor cantidad.

Categórica vs categóricas

aux <- with(propinas, table(dia,cantidad)) 

head(aux)
    cantidad
dia   1  2  3  4  5  6
  Do  0 39 15 18  3  1
  Ju  1 48  4  5  1  3
  Sa  2 53 18 13  1  0
  Vi  1 16  1  1  0  0
dt <- data.frame(aux)

head(dt)
  dia cantidad Freq
1  Do        1    0
2  Ju        1    1
3  Sa        1    2
4  Vi        1    1
5  Do        2   39
6  Ju        2   48

Categórica vs categóricas

ggplot(data = dt,
        aes(x =  dia, y = cantidad)) +
  geom_tile(aes(fill = Freq))

Categórica vs categóricas

  • geom_bar() sirve para describir la distribución de variables categóricas, para cada categoría la altura de la barra es proporcional al número de caso en cada grupo. Se puede representar alternativamente en terminos de proporción o porcentaje.

  • Si queremos representar más de una variable categórica usamos gráficos de barras apilados (stacked bar graph).

Categórica vs categóricas

geom_bar()

  • Gráficos de barras apilados simples: pone los valores en segmentos uno atrás de otro para cada categoría. El valor total de una barra es la suma de todos los segmentos. Sirve para comparar el monto total para cada categoría.

  • Gráficos de barras apilados 100%: muestra el porcentaje para cada categoría al interior de un grupo. Esto hace más sencillo de ver las diferencias relativas entre grupos.

Ejemplos geom

p <- ggplot(propinas, aes(x = dia, 
                fill = fuma)) 
  • p + geom_bar()
  • p + geom_bar(position="stack")
  • p + geom_bar(position="dodge")
  • p + geom_bar(position="fill")

Más ggplot2, scales

  • Los datos hay que convertirlos desde unidades datos (moneda, sexo, etc) a unidades gráficas, aes (color,forma, etc) que se pueden representar en la computadora.

  • La conversión es llamada escalado y es realizada por scales

  • Los scales controlan el mapeo de los datos a los atributos estéticos (aes)

Más ggplot2, scales

  • Necesitamos un scale para cada aes y cada scale opera para todos los datos en el gráfico que permite un mapeo consistente entre los datos a los aes

  • Estas especificaciones estéticas que tienen sentido para R se describen en vignette("ggplot2-specs") link

scales

  • Mapeo estético (aes) solamente dice que una variable debe ser mapeada a un elemento estético pero no dice cómo debe ser.

  • Cuando mapeo una variable a shape usando aes(shape = x) no especifico la forma (shape) particular que debe tomar, se usa la de defecto.

  • Cuando uso aes(color = z) no digo de que color debe ser

  • Describir el color, la forma, el tamaño etc (color, shape, size) a usar se hace mediante transformaciones en scale

scales

  • x e y
  • color y fill
  • size
  • shape
  • linetype

Las scales se modifican con una serie de funciones con el siguiente esquema de nombrado scale_<aesthetic>_<type>. Mirar scale_<tab> ver la lista de las funciones de scale.

ejemplo: scale_color_manual para cambiar el color de forma manual

scales disponibles

Gramática de gráficos

library(tidyverse)
propinas <- read_csv("propina.csv")

ggplot(data = propinas, aes(x = total, y = propina)) +
                           geom_point( aes(colour = fuma)) 

Gramática de gráficos

Equivalente a:

ggplot(data = propinas, 
       aes(x = total, y = propina)) +
       geom_point( aes(colour = fuma)) +
       scale_x_continuous() + 
       scale_y_continuous() + 
       scale_colour_discrete()

Gramática de gráficos

Cambio los límites del eje x y valores que se incluyen:

ggplot(data = propinas, 
       aes(x = total, y = propina)) +
       geom_point( aes(colour = fuma)) +
       scale_x_continuous(limits = c(-10, 60),
                          breaks = seq(-10, 60, 5)) + 
       scale_y_continuous() + 
       scale_colour_discrete()

¿Qué hay atrás de este plot?

  • Cada observación representada como un punto cuya posición está de acuerdo a dos variables (posición horizontal y vertical)

  • Cada punto tiene tamaño, color y forma estos atributos son llamados elementos estéticos (inglés aesthetics aes )

  • Los aes son propiedades que pueden ser percibidas en el gráfico cada aes puede ser mapeado a una variable o fijado en un valor constante

  • total es mapeado a la posición horizontal, propina a la posición vertical y fuma al color. Tamaño y forma no son mapeados a variables (valor por defecto)

¿Qué hay atrás de este plot?

# A tibble: 3 × 3
  total propina fuma 
  <dbl>   <dbl> <chr>
1  17.0    1.01 No   
2  10.3    1.66 No   
3  21.0    3.5  No   
  • Nuevos datos, mapeo de los elementos estéticos a los datos originales
x y colour
17.0 1.01 No
10.3 1.66 No
21.0 3.5 No

Capas de un gráfico

  • Los datos, mapeos estéticos, objetos geométricos y las transformaciones estadísticas forman una capa

  • Podemos tener un gráfico con muchas capas

Capas de un gráfico

La gramática de capas define componentes de un gráfico:

  • datos y conjunto de mapeos de variables a elementos estéticos

  • una o más capas, cada capa tiene un elemento geométrico, una transformación estadística, una posición y opcional datos y aes

Capas de un gráfico

ggplot() +
  layer(
    data = propinas, mapping = aes(x = total, y = propina), 
    geom = "point", stat = "identity", position = "identity"
  ) +
  scale_x_continuous() +
  scale_y_continuous() +
  coord_cartesian()

Equivalente a :

ggplot() +
  geom_point(data = propinas, aes(x = total, y = propina)) 

Capas de un gráfico

stat: es el nombre de la transformación estadística a utilizar. Para que los datos sean usados como están sin transformar se usa stat ='identity'. Más info https://rpubs.com/hadley/ggplot2-layers

position: el método usado para ajustar sobreploteo.Más info https://rpubs.com/hadley/ggplot2-layers

Capas de un gráfico

Varios conjuntos de datos:

ggplot() +
  geom_point(data = propinas, aes(x = total, y = propina)) +
  geom_point(data = data.frame(x = 30, y = 6), aes(x, y), 
             color = "red", size = 10)

Capas de un gráfico

Varios conjuntos de datos:

p1 <- ggplot() +
  layer(
    data = propinas, mapping = aes(x = total, y = propina), 
    geom = "point", stat = "identity", position = "identity"
  ) +
  scale_x_continuous() +
  scale_y_continuous() +
  coord_cartesian()

p1 + 
  layer(data = data.frame(x = 30, y = 6), 
           mapping = aes(x = x, y = y, color = I("red"), 
                         size = I(10)), geom = 'point', 
        stat = 'identity', position ='identity') +
  scale_x_continuous() +
  scale_y_continuous() +
  coord_cartesian()

Capas de un gráfico

  • Si hay más de un conjunto de datos en el gráfico poner los datos en la capa que corresponda ser utilizados.

  • Si pongo los datos al inicio ggplot(data = propina) esos datos son usados en todas las capas

  • Si tengo una única capa la forma de especificar los aes no hace la diferencia pero si agrego capas hay diferencias según en que capa especifico el aes

Otros geoms

Cuando substituimos geom_pont() por otro geom obtenemos un gráfico distinto. Los geom más comunes:

  • geom_smooth()
  • geom_boxplot()
  • geom_histogram()
  • geom_bar()
  • geom_path() y geom_lines()

cada geom_ tiene asociados elementos estéticos particulares

Incluir labs

ggplot(data = propinas, aes(x = total, y = propina,
                            color = sexo)) +
  geom_point() +  theme(aspect.ratio = 1) +
  labs(x = "Total de la cuenta", y = "Propina", color = "Sexo")

Incluir labs

ggplot(data = propinas, aes(x = total, y = propina,
                            color = sexo))+
  geom_point() + theme(aspect.ratio = 1) + 
  scale_x_continuous(name ="Total de la cuenta") +
  scale_y_continuous(name = "Propina") +
  scale_color_discrete(name = "Sexo")

Incluir labs

Sobrescribe el scale si aplico dos veces el mismo

ggplot( data = propinas, aes(x = total, y = propina,
                             color = sexo))+
  geom_point() + theme(aspect.ratio = 1) + 
  scale_x_continuous(name ="Total de la cuenta") +
  scale_x_continuous(name ="Total") +
  scale_y_continuous(name = "Propina") +
  scale_color_discrete(name = "Sexo")

Material del curso

Material del curso está bajo licencia Creative Commons BY-NC-SA 3.0

Wilke, Claus O. 2019. Fundamentals of Data Visualization: A Primer on Making Informative and Compelling Figures. O’Reilly Media.